import {MessageBox} from 'element-ui';

const PREFIX = process.env.VUE_APP_COOKIE_PREFIX;

function setItem(key: string, value: any): void {
  sessionStorage.setItem(PREFIX + key, value);
}

function getItem(key: string): string | null {
  return sessionStorage.getItem(PREFIX + key);
}

function removeItem(key: string): void {
  sessionStorage.removeItem(PREFIX + key);
}

/**
 * 双因素认证工具类
 */
class OtpUtils {
  /**
   * 缓存动态密码
   * @param data 密钥
   */
  public static set(data: string): void {
    setItem('otp', data);
  }

  /**
   * 清理动态密码
   */
  public static clean(): void {
    removeItem('otp');
  }

  /**
   * 获取动态密码
   * @return 动态密码
   */
  public static getOtp(): string | null {
    const otp = getItem('otp') || '';
    removeItem('otp');
    return otp;
  }

  /**
   * 启用动态密码
   * @return 动态密码
   */
  public static enableOtp(): Promise<string> {
    return new Promise((resolve, reject) => {
      if (getItem('enable-otp')) {
        return;
      }
      setItem('enable-otp', true);
      MessageBox.prompt('请输入动态密码', '双因子认证', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputPattern: /[\d]{6}?/,
        inputErrorMessage: '动态密码格式不正确'
      }).then((data) => {
        removeItem('enable-otp');
        const value = (data as any).value;
        OtpUtils.set(value);
        resolve(value);
      }).catch(() => {
        removeItem('enable-otp');
        reject();
      });
    });
  }
}

export default OtpUtils;
